/*
 * libProcPedido.c
 *
 *  Created on: 04/05/2012
 *      Author: utnso
 */
#include "libProcPedido.h"

void procesarPedidoCliente(char* recibo, char** envio, uint16_t* tamanioEnvio) {
	paquete_t paqueteRecibo = deserializar(recibo);
	paquete_t paqueteEnvio;
	paqueteEnvio.payload = NULL;

	switch (paqueteRecibo.tipo) {
	case TIPO_HANDSHAKE:
		paqueteEnvio.tipo = TIPO_HANDSHAKE;
		paqueteEnvio.pLength = 0;
		break;
	case TIPO_CREAR_ARCHIVO:
		ProcPedidoCrearArch(paqueteRecibo, &paqueteEnvio);
		break;
	case TIPO_ABRIR_ARCHIVO:
		ProcPedidoAbrirArch(paqueteRecibo, &paqueteEnvio);
		break;
	case TIPO_LEER_ARCHIVO:
		ProcPedidoLeerArch(paqueteRecibo, &paqueteEnvio);
		break;
	case TIPO_ESCRIBIR_ARCHIVO:
		ProcPedidoEscribirArch(paqueteRecibo, &paqueteEnvio);
		break;
	case TIPO_BORRAR_ARCHIVO:
		ProcPedidoBorrarArch(paqueteRecibo, &paqueteEnvio);
		break;
	case TIPO_TRUNCAR_ARCHIVO:
		ProcPedidoTruncarArch(paqueteRecibo, &paqueteEnvio);
		break;
	case TIPO_CERRAR_ARCHIVO:
		ProcPedidoCerrarArch(paqueteRecibo, &paqueteEnvio);
		break;
	case TIPO_CREAR_DIRECTORIO:
		ProcPedidoCrearDir(paqueteRecibo, &paqueteEnvio);
		break;
	case TIPO_LEER_DIRECTORIO:
		ProcPedidoLeerDir(paqueteRecibo, &paqueteEnvio);
		break;
	case TIPO_BORRAR_DIRECTORIO:
		ProcPedidoBorrarDir(paqueteRecibo, &paqueteEnvio);
		break;
	case TIPO_OBTENER_ATRIBUTOS:
		ProcPedidoObtenerAttr(paqueteRecibo, &paqueteEnvio);
		break;
	case TIPO_RENOMBRAR:
		ProcPedidoRenombrar(paqueteRecibo, &paqueteEnvio);
		break;
	case TIPO_ERROR:
		ProcPedidoError(paqueteRecibo, &paqueteEnvio);
		break;
	default:
		paqueteEnvio.tipo = TIPO_ERROR;
		paqueteEnvio.pLength = 13;
		paqueteEnvio.payload = malloc(13);
		memcpy(paqueteEnvio.payload, "TIPO_INVALIDO", 13);
		break;
	}
	*envio = serializar(paqueteEnvio);
	*tamanioEnvio = paqueteEnvio.pLength + 3;
}

void ProcPedidoCrearArch(paquete_t paqueteRecibo, paquete_t *paqueteEnvio){
	argCrearArch_t arg = parsearEnvioCrearArchivo(paqueteRecibo.payload);

	int32_t res = crearArchivo(arg.path, arg.modo);
	paqueteEnvio->tipo = TIPO_CREAR_ARCHIVO;
	paqueteEnvio->pLength = sizeof(int32_t);
	paqueteEnvio->payload = desparsearReciboSinBuffer(res);
}

void ProcPedidoAbrirArch(paquete_t paqueteRecibo, paquete_t *paqueteEnvio){

}

void ProcPedidoLeerArch(paquete_t paqueteRecibo, paquete_t *paqueteEnvio){

}

void ProcPedidoEscribirArch(paquete_t paqueteRecibo, paquete_t *paqueteEnvio){

}

void ProcPedidoBorrarArch(paquete_t paqueteRecibo, paquete_t *paqueteEnvio){

}

void ProcPedidoTruncarArch(paquete_t paqueteRecibo, paquete_t *paqueteEnvio){

}

void ProcPedidoCerrarArch(paquete_t paqueteRecibo, paquete_t *paqueteEnvio){

}

void ProcPedidoCrearDir(paquete_t paqueteRecibo, paquete_t *paqueteEnvio){

}

void ProcPedidoLeerDir(paquete_t paqueteRecibo, paquete_t *paqueteEnvio){
	argLeerDir_t arg = parsearEnvioLeerDirectorio(paqueteRecibo.payload);

	int32_t res = leerDirectorio(arg.path, arg.offset);
	paqueteEnvio->tipo = TIPO_LEER_DIRECTORIO;
	paqueteEnvio->pLength = sizeof(int32_t);
	paqueteEnvio->payload = desparsearReciboSinBuffer(res);
}

void ProcPedidoBorrarDir(paquete_t paqueteRecibo, paquete_t *paqueteEnvio){

}

void ProcPedidoObtenerAttr(paquete_t paqueteRecibo, paquete_t *paqueteEnvio){
	argGetAttr_t arg = parsearEnvioObtenerAtributos(paqueteRecibo.payload);

	attrDirArch_t attrDirArch;
	int32_t res = obtenerAtributos(arg.path, &attrDirArch);
	paqueteEnvio->tipo = TIPO_LEER_DIRECTORIO;
	paqueteEnvio->pLength = tamanioReciboConAtributos(res, attrDirArch.modo,attrDirArch.size);
	paqueteEnvio->payload = desparsearReciboConAtributos(res, attrDirArch.modo , attrDirArch.size);
}

void ProcPedidoRenombrar(paquete_t paqueteRecibo, paquete_t *paqueteEnvio){

}

void ProcPedidoError(paquete_t paqueteRecibo, paquete_t *paqueteEnvio){

}
